﻿#include<iostream>
#include<string>
#include<sstream>
using namespace std;
using std::string;
using std::stringstream;

typedef struct Role {
	string Id;
	int Exp;
} *PROLE;

int main() {
	string strData = "id=TomyClare;exp=9523;id=Sunny;exp=9523;id=DyBaby;exp=25301;id=Simple;exp=25301;id=Bkacs11;exp=2100;id=DumpX;exp=36520;";

	int istart{}, iend{}, icount{};

	//因为每个角色都是有2个属性，所以查找所有属性数量除以2就是角色数
	for (int i = 0; i < strData.length(); i++) {
		if (strData[i] == ';') {
			icount++;
			i += 3;
		}
	}
	PROLE pRole = new Role[icount / 2];//根据角色数创建结构体数组
	icount = 0;

	do {
		istart = strData.find("id=", istart);//得到id=在当前角色的位置，不加istart会让函数从开头开始查找
		if (istart == std::string::npos)break;//如果没有则表示已经读完了
		iend = strData.find(";", istart + 3);//得到；在在当前角色id的位置
		pRole[icount].Id = strData.substr(istart + 3, iend - istart - 3);//因为Id的数据类型是string，可以直接将角色Id赋值于结构体中
		istart = iend + 1;//当前Id读完需要读取exp
		istart = strData.find("exp=", istart);//得到exp=在当前角色的位置，不加istart会让函数从开头开始查找
		iend = strData.find(";", istart + 4);////得到；在在当前角色exp的位置
		pRole[icount++].Exp = std::stoi(strData.substr(istart + 4, iend - istart - 4));//因为Exp的数据类型是int，需要先将角色exp转化为int，再赋值于结构体中
		istart = iend + 1;//当前Id读完需要读取下一个角色
	} while (true);

	for (int i = 1; i < icount; i++) {
		for (int y = 1; y < icount; y++) {
			if (pRole[y].Exp > pRole[y - 1].Exp) {
				Role tmp = pRole[y - 1];
				pRole[y - 1] = pRole[y];
				pRole[y] = tmp;
			}
		}
	}

	for (int i = 0; i < icount; i++) {
		cout << pRole[i].Id << " " << pRole[i].Exp << endl;
	}
}